iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 11
0

使用者呼叫api時,會依照該api的功能,帶上不同的參數進來,但是這些參數不像go的函數互相呼叫那樣簡單獲得。

func getSum(x, y int) (int, error)

一般go的函數會像上面這樣,帶進來的參數就只會是x跟y,
x跟y也是固定的整數。
但是httphandler帶進來的參數長這樣

func ping() http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
    }
}

http.Request

我們常常會使用curl來測試api,在呼叫的時候,常常看到像這樣的參數

curl https://webserver.com?id=123

或是將送出json格式的參數

curl "http://webserver.com/user" -H "Content-Type: application/json" -X POST -d '{"id":"123"}'

當我們的服務收到這些參數時,都是存放在http.Request內,
而我們要使用這些參數時,該怎麼辦呢?

url.Values

在第一個範例內,透過curl帶上的參數,
可以透過下面的方式取得跟使用

vars := r.URL.Query()
idSlice, ok := vars["id"]
		if ok {
			if len(idSlice) != 0 {
				id := idSlice[0]
			}
		}

透過URL.Query就可以取出參數來使用。

json

第二個範例裡,參數是以json的形式傳送過來的,這時就不會放在url.Values內了,
要取出參數必須要用這種方式

 type userPara struct {
 	ID         string `json:"id"`
 }
reqBody, err := ioutil.ReadAll(r.Body)
if err !=nil {
  ...
}
idPara := &userPara{}
err = json.Unmarshal(reqBody, &idPara)
if err !=nil {
  ...
}

這樣就可以把參數unmarshal到idPara內了,不過這種unmarshal方式會消耗比較多的記憶體,
下一章我們會介紹另一個套件,可以更方便取出json內的參數,也比較節省記憶體。


上一篇
Day10-api與 Http handler
下一篇
Day12-json以及jsonparser
系列文
從0開始的golang web server30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言